﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Obligatorio1.Modelo;
using Obligatorio1.Controladores;


namespace Obligatorio1
{
    class ManejadorConsultas
    {
        private static ManejadorConsultas manejador = null;

        public static ManejadorConsultas getInstance()
        {
            if (manejador == null)
            { manejador = new ManejadorConsultas(); }
            return manejador;
        }

        public List<Persona> ListarPersonas() 
        {
            //Buscamos contra la base
            return ManejadorPersona.getInstance().listar();
             
        }

        //Nombre 
        //Apellido
        //Telefono
        //Direccion
        //Rango de fechas
        //Grupo
        //Email
        //Fechas
    public List<Persona> ListarPersonasCriterios(String nombre,String apellido, String telefono,
            String direccion, String email, String grupo, DateTime fechaInicio, DateTime fechaFinal,
            bool buscarPorCumple)
        {
            Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();

         var personas = from Persona p in oe.Persona
                        
                        where (nombre == "" || p.nombre.Contains(nombre)) && 
                            (apellido == "" || p.apellido.Contains(apellido)) &&                          
                            (fechaInicio == DateTime.MaxValue || (p.fechaNacimiento >= fechaInicio && p.fechaNacimiento < fechaFinal)) &&
                           
                            (telefono == "" ||
                            (from Telefono t in oe.Telefono
                             where t.idPersona == p.id
                             select t.numero).Contains(telefono)) &&

                            (email == "" ||
                            (from Email e in oe.Email
                             where e.idPersona == p.id
                             select e.email).Contains(email)) &&


                            (direccion == "" ||
                            (from Direccion d in oe.Direccion
                             where d.idPersona == p.id
                             select d.direccion).Contains(direccion)) &&

                            (grupo == "" ||
                            (from Grupo g in oe.Grupo
                             where g.Persona.Contains(p)
                             select g.nombre).Contains(grupo))

                          orderby p.nombre, p.apellido 
                          select p;

         if (buscarPorCumple)
             return filtrarPorCumple(personas.ToList());
         else
             return personas.ToList();          
        }


    public List<Persona> ListarPersonasCriterios(String nombre, String apellido, String telefono,
            String direccion, String email, String grupo, DateTime fechaInicio, DateTime fechaFinal,
            bool buscarPorCumple, Agenda.Order modo)
    {
        Obligatorio1Entities oe = GestorModelo.getInstance().getModelo();

        var personas = from Persona p in oe.Persona

                       where (nombre == "" || p.nombre.Contains(nombre)) &&
                           (apellido == "" || p.apellido.Contains(apellido)) &&
                           (fechaInicio == DateTime.MaxValue || (p.fechaNacimiento >= fechaInicio && p.fechaNacimiento < fechaFinal)) &&

                           (telefono == "" ||
                           (from Telefono t in oe.Telefono
                            where t.idPersona == p.id
                            select t.numero).Contains(telefono)) &&

                           (email == "" ||
                           (from Email e in oe.Email
                            where e.idPersona == p.id
                            select e.email).Contains(email)) &&


                           (direccion == "" ||
                           (from Direccion d in oe.Direccion
                            where d.idPersona == p.id
                            select d.direccion).Contains(direccion)) &&

                           (grupo == "" ||
                           (from Grupo g in oe.Grupo
                            where g.Persona.Contains(p)
                            select g.nombre).Contains(grupo))

                       orderby p.apellido, p.nombre
                       select p;

        if (buscarPorCumple)
            return filtrarPorCumple(personas.ToList());
        else
            return personas.ToList();
    }

    private List<Persona> filtrarPorCumple(List<Persona> personas)
    {
        List<Persona> persCumple = new List<Persona>();
        foreach (Persona p in personas) 
        {
            if (ManejadorPersona.getInstance().getCumpleanio(p) >= DateTime.Today && ManejadorPersona.getInstance().getCumpleanio(p) < DateTime.Today.AddDays(7))
            {
                persCumple.Add(p);
            }
        }
        return persCumple;
    }

    }
   
}
